package com.bt.lms.dao.servise;

import com.bt.lms.entity.Role;
import com.bt.lms.entity.User;
import com.bt.lms.entity.page.Page;
import com.bt.lms.dao.entity.RlUserRolePo;
import java.util.List;

/**
 * 后台用户dao
 *
 * @author 徐大永
 */
public interface UserDao {

    /**
     * 插入用户
     *
     * @param sql  要执行的sql
     * @param user 用户PO
     * @return 插入数据的id
     */
    Long insert(String sql, User user);

    /**
     * 插入关系*
     * （用户和角色）
     *
     * @param sql     要执行的sql
     * @param userIds 要添加上的用户id
     * @return 影响行数
     */
    int insertRlS(String sql, List<Long> userIds,Long roleId);

    /**
     * 详情
     * 用户
     *
     * @param sql  要执行的sql
     * @param id 用户id
     * @return 拿完结果的对象
     */
    User selectUser(String sql, Long id);

    /**
     * 查询角色
     *  查询出的角色只有姓名，且在输入的用户关系中
     * @param sqlRl 要执行的sql
     * @param user 要查询角色的用户
     */
    List<Role> selectRole(String sqlRl, User user);

    /**
     * 详情（角色用户）
     *  查询出所有此角色关联的用户
     * @param sql 要执行的sql
     * @param userPage 分页模型（用户）
     * @param roleId 角色id
     * @return 用户信息*
     */
    List<User> select(String sql, Page<User> userPage, Long roleId);

    /**
     * 详情
     * 关系（用户和角色）
     *
     * @param sqlRl 要执行的sql
     * @param id    查询使用的id
     * @return 查询出的所有关系对象
     */
    List<RlUserRolePo> selectRl(String sqlRl, Long id);

    /**
     * 详情
     * 用户关联的角色信息
     *
     * @param roleSql 要执行的sql
     * @param id      角色id
     * @return 角色
     */
    Role select(String roleSql, Long id);

    /**
     * 查询总数（关系
     * @param roleSum 要执行的sql
     * @param roleId 角色id
     */
    Long selectSum(String roleSum, Long roleId);

    /**
     * 查询总数
     * @param userSum 要执行的sql
     * @return 用户总数
     */
    Long selectSum(String userSum);

    /**
     * 编辑用户信息（全部）
     *
     * @param userSql 要执行的sql
     * @param user    编辑好的用户信息
     * @return 影响行数
     */
    int update(String userSql, User user);

    /**
     * 删除关系
     * 用户和角色
     *
     * @param rlSql 要执行的sql
     * @param id    要删除的用户id
     * @return 是否成功
     */
    boolean deleteRl(String rlSql, Long id);

    /**
     * 删除用户
     *
     * @param userSql 要执行的sql
     * @param id      要删除的用户id
     * @return 是否成功
     */
    boolean delete(String userSql, Long id);

    /**
     * 修改用户信息（一列）
     *
     * @param sql 要执行的sql
     * @param id  要修改的用户id
     * @param i   要修改成的状态
     * @return 影响行数
     */
    int update(String sql, Long id, Object i);

    /**
     * 查询用户
     * 同时将查询到的数据变成PO并放到集合中
     *
     * @param userSql    查询具体用户信息的sql
     * @param page  分页模型（内含开始位置及大小）
     * @param users      要放入的集合
     * @param userSumSql 查询总数的sql
     */
    void query(String userSql, Page page, List<User> users, String userSumSql);

    /**
     * 查询
     * 关系（用户与角色）
     *
     * @param rlSql  要执行的sql
     * @param userId 用户id
     * @return 角色id*
     */
    List<Long> queryRl(String rlSql, Long userId);

    /**
     * 查询 角色（名字+id）
     *
     * @param roleSql 要执行的sql
     * @param roleId  角色id
     * @return 角色信息
     */
    Role queryRole(String roleSql, Long roleId);

}
